package com.cj.util; //定义包名

import java.security.MessageDigest; // 导入 MessageDigest 类用于生成 MD5 摘要

public class MD5Util { // 声明 MD5Util 类

    // 将字节数组转换为十六进制字符串
    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer(); // 创建 StringBuffer 用于存储结果
        for (int i = 0; i < b.length; i++) // 遍历字节数组
            resultSb.append(byteToHexString(b[i])); // 将每个字节转换为十六进制字符串并追加到结果中

        return resultSb.toString(); // 返回最终的十六进制字符串
    }

    // 将单个字节转换为十六进制字符串
    private static String byteToHexString(byte b) {
        int n = b; // 将字节转为整数
        if (n < 0) // 如果是负数，调整为正数
            n += 256;
        int d1 = n / 16; // 计算高位
        int d2 = n % 16; // 计算低位
        return hexDigits[d1] + hexDigits[d2]; // 返回对应的十六进制字符
    }

    /**
     * 返回大写的MD5值
     *
     * @param origin 原始字符串
     * @param charsetname 字符集名称
     * @return MD5大写字符串
     */
    private static String MD5Encode(String origin, String charsetname) {
        String resultString = null; // 存储结果字符串
        try {
            resultString = new String(origin); // 将原始字符串转换为新字符串
            MessageDigest md = MessageDigest.getInstance("MD5"); // 创建 MD5 摘要实例
            if (charsetname == null || "".equals(charsetname)) // 如果字符集为空
                resultString = byteArrayToHexString(md.digest(resultString.getBytes())); // 计算摘要并转换为十六进制字符串
            else
                resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname))); // 使用指定字符集计算摘要
        } catch (Exception exception) { // 异常处理
        }
        return resultString.toUpperCase(); // 返回大写的 MD5 字符串
    }

    // 使用 UTF-8 编码进行 MD5 加密
    public static String MD5EncodeUtf8(String origin) {
        // 盐值 Salt 加密（可以解除注释以使用盐值）
        // origin = origin + PropertiesUtil.getProperty("password.salt", "");
        return MD5Encode(origin, "utf-8"); // 调用 MD5Encode 方法并指定字符集为 UTF-8
    }

    // 定义十六进制字符的数组
    private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
}
